package com.zhitan.netty.service;

import com.zhitan.netty.bean.NettyMessage;
import com.zhitan.netty.bean.SwitchPileRequest;
import com.zhitan.netty.bean.UpdatePileRequest;
import io.netty.channel.ChannelHandlerContext;

import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.List;

/**
 * 处理接
 */
public interface INettyServerHandlerService {

    /**
     * 处理netty的数据
     *
     * @param ctx          netty上下文
     * @param nettyMessage 数据
     */
    void handler(@NotNull ChannelHandlerContext ctx, @NotNull NettyMessage nettyMessage) throws InterruptedException;

    /**
     * 发送获取实时数据命令0x12
     *
     * @param deviceNo 设备号
     * @param portNo   端口号/枪号
     */
    void sendGetRealTimeDataCMD(String deviceNo, int portNo);

    /**
     * 远程账户余额更新 0x42
     * 平台在用户完成充值后会将用户更新的余额下发到充电桩,
     * 桩接收到此数据帧需要对当前充电用户的信息进行校验并更新余额信息
     *
     * @param deviceNo 设备号
     * @param amount   金额
     */
    @Deprecated
    void updateUserAmount(String deviceNo, BigDecimal amount);

    /**
     * 离线卡数据清除 0x46
     * 平台再充电桩在线时下发此数据帧，充电桩接收到报文后清除桩本地对应的离线卡数据
     *
     * @param deviceNo 设备号
     * @param cards    卡列表,卡号必须是8位
     */
    @Deprecated
    void clearOfflineCardData(String deviceNo, List<String> cards);

    /**
     * 离线卡数据查询 0x48
     * 平台再充电桩在线时下发此数据帧到充电桩，充电桩接收到该报文后查询桩本地是否存在对应的离线卡
     *
     * @param deviceNo 设备号
     * @param cards    卡列表,卡号必须是8位
     */
    @Deprecated
    void getOfflineCardData(String deviceNo, List<String> cards);

    /**
     * 工作参数设置 0x52 采用云快充1.8版本
     * 远程设置充电桩是否停用；设置充电桩允许输出功率，以实现电网功率的调节
     *
     * @param deviceNo  设备ID
     * @param portNo    枪号
     * @param maxPower  允许最大功率 单位：kW
     * @param limitTime 限制时间 单位：分钟
     */
    void setDeviceWorkSetting(String deviceNo, Integer portNo, int maxPower, int limitTime);

    /**
     * 对时设置 0x56
     * 运营平台同步充电桩时钟，以确保充电桩与运营平台的时钟一致
     *
     * @param deviceNo 设备编号
     */
    void timing(String deviceNo);

    /**
     * 计费模型设置 0x58
     * 用户充电费用计算，每半小时为一个费率段，共48段，
     * 每段对应尖峰平谷其中一个费率充电时桩屏幕按此费率分别显示已充电费和服务费
     *
     * @param deviceNo 设备编号
     */
    void setFeeModel(@NotNull String deviceNo);

    /**
     * 读取SIM卡号 0x76
     *
     * @param deviceNo 设备号
     */
    void readSimCardNo(String deviceNo);

    /**
     * 远程重启 0x92
     * 重启充电桩，应对部分问题，如卡死等
     *
     * @param deviceNo 设备号
     * @param type     0立即执行 1空闲执行
     */
    void reboot(String deviceNo, int type);

    /**
     * ota升级
     *
     * @param reqs 升级请求文件
     */
    void ota(List<UpdatePileRequest> reqs);

    /**
     * 启动充电
     *
     * @param deviceNo   设备号
     * @param devicePort 枪号
     * @param orderNo    订单号
     * @param amount     金额
     */
    void startCharging(String deviceNo, String devicePort, String orderNo, int amount);

    /**
     * 启动充电
     *
     * @param deviceNo   设备号
     * @param devicePort 枪号
     */
    void endCharging(String deviceNo, String devicePort);

    /**
     * 设备启停测试用
     *
     * @param reqs 设备号和状态列表
     */
    void switchPile(List<SwitchPileRequest> reqs);
}
